package com.vecspace.database.dao;

import javax.annotation.Resource;

import com.vecspace.database.model.PojoManager;

public abstract class AbstractDao {
	@Resource(name="daoHelper")
	protected DaoHelper dao;
	 
	public DaoHelper getDao() {
		return dao;
	}
	public void setDao(DaoHelper dao) {
		this.dao = dao;
	}
	
	/**获取指定记录指定字段的值，从BasePO中获取表名和ID字段名。
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @param propName POJO的属性名
	 * @return
	 * @throws Exception 
	 * @author Administrator
	 * @reviewer  
	 * @createTime 2021年10月3日 下午8:59:10
	 */
	public Object getValueByPropName(Class<?> clazz, Object id, String propName) throws Exception {
		String columnName = PojoManager.getColumnName(clazz, propName);
		return this.getValue(clazz, id, columnName);
	}
	
	/**获取指定记录指定字段的值，从BasePO中获取表名和ID字段名。
	 *
	 * @param clazz
	 * @param id
	 * @param columnName
	 * @return
	 * @throws Exception 
	 * @author Administrator
	 * @reviewer  
	 * @createTime 2021年10月3日 下午8:59:10
	 */
	public Object getValue(Class<?> clazz, Object id, String columnName) throws Exception {
		String tableName = PojoManager.getTableName(clazz);
		String idColumn = PojoManager.getIdColumnName(clazz);
		return this.getValue(tableName, idColumn, id, columnName);
	}
	/**获取指定记录指定字段的值
	 * 
	 * @param tableName
	 * @param idColumn
	 * @param id
	 * @param columnName
	 * @return
	 * @throws Exception 
	 * @author Administrator
	 * @reviewer  
	 * @createTime 2021年10月3日 下午8:54:15
	 */
	public Object getValue(String tableName, String idColumn, Object id, String columnName) throws Exception {
		String sql = String.format("select %s from %s where %s=?", columnName, tableName, idColumn);
		Object value = dao.queryValue(sql, new Object[] {id});
		return value;
	}
	
	/**更新指定记录的一个字段的值，从BasePO中获取表名和ID字段名。
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @param propName POJO的属性名
	 * @param value
	 * @throws Exception 
	 * @author Administrator
	 * @reviewer  
	 * @createTime 2021年10月3日 下午9:06:04
	 */
	public  void updateValueByPropName(Class<?> clazz, Object id, String propName, Object value) throws Exception {
		String columnName = PojoManager.getColumnName(clazz, propName);
		this.updateValue(clazz, id, columnName, value);
	}
	
	/**更新指定记录的一个字段的值，从BasePO中获取表名和ID字段名。
	 *
	 * @param clazz
	 * @param id
	 * @param columnName
	 * @param value
	 * @throws Exception 
	 * @author Administrator
	 * @reviewer  
	 * @createTime 2021年10月3日 下午9:01:02
	 */
	public void updateValue(Class<?> clazz, Object id, String columnName, Object value) throws Exception {
		String tableName = PojoManager.getTableName(clazz);
		String idColumn = PojoManager.getIdColumnName(clazz);
		this.updateValue(tableName, idColumn, id, columnName, value);
	}
	
	/**更新指定记录的一个字段的值
	 * 
	 * @param tableName 表名
	 * @param idColumn 表的ID字段名
	 * @param id ID值
	 * @param columnName 要更新的字段名
	 * @param value 要更新字段值
	 * @throws Exception 
	 * @author wanghua
	 * @reviewer  
	 * @createTime 2021年10月3日 下午8:50:36
	 */
	public void updateValue(String tableName, String idColumn, Object id, String columnName, Object value) throws Exception {		
		String sql = String.format("update %s set %s=? where %s=?", tableName, columnName, idColumn);
		dao.updateDataRowBySql(sql, new Object[] {value, id});
	}

	/**在删除一条记录之前检查是否有被引用
	 *
	 * @param tableName
	 * @param id
	 * @author wanghua
	 * @date 2021/11/5  17:53
	 * @return void
	 **/
	public void checkReferenced(String tableName, Long id) throws Exception{

	}
	
}
